package com.zhisheng.day10_tlias.aop;
/*
    对业务层所有的方法进行耗时统计
 */

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAop {

    @Around("mycut()")
    public Object abcd(ProceedingJoinPoint pjp){
        // 在方法执行前,获取一个系统时间,方法执行后,再获取一个系统时间,两个时间差就是代码执行的耗时
        long t1 = System.currentTimeMillis();
        // 让原始方法执行
        Object proceed = null;
        try {
             proceed= pjp.proceed();
        } catch (Throwable e) {
           // throw new RuntimeException(e);
            e.printStackTrace();
            return null;
        }
        long t2 = System.currentTimeMillis();
        // 面向pjp获取当前正在执行的类和方法
        // 获取类名
        String declaringTypeName = pjp.getSignature().getDeclaringTypeName();
        // 获取方法名
        String name = pjp.getSignature().getName();
        System.err.println("执行=========================================================="+declaringTypeName+"中的"+name+"方法的时候,耗时:"+(t2-t1));
        return proceed;
    }

    @Pointcut("execution(* com.zhisheng.day10_tlias.service.impl.*.*(..))")
    public void mycut(){} // 这个方法的唯一作用就是承载 @Pointcut 注解中的表达式的,可以让 abcd和bbcd方法共有这个表达式

    @Around("mycut()")
    public Object bbcd(ProceedingJoinPoint pjp){
        // 在方法执行前,获取一个系统时间,方法执行后,再获取一个系统时间,两个时间差就是代码执行的耗时
        try {
            System.out.println("我要盯着你执行...................");
                Object proceed = pjp.proceed();
            System.out.println("你很棒,没有出问题...................");
            return proceed;
        }catch (Throwable e) {
            // 获取类名
            String declaringTypeName = pjp.getSignature().getDeclaringTypeName();
            // 获取方法名
            String name = pjp.getSignature().getName();
            System.out.println("监控到:"+declaringTypeName+"中的"+name+"出异常了..........");
            throw new RuntimeException(e);
        }
    }
}
